home *** CD-ROM | disk | FTP | other *** search
/ Aminet 52 / Aminet 52 (2002)(GTI - Schatztruhe)[!][Dec 2002].iso / Aminet / game / patch / WHDIDemos.lzh / PygmyProjects_Extension.lha / ExtensionHD / src / Extension.slave.asm < prev   
Assembly Source File  |  2000-05-12  |  4KB  |  243 lines

  1. ; Extension ©1993 Pygmy Projects
  2. ; loader by Kyzer/CSG
  3.  
  4. DEBUG=1
  5. CHIPMEM    equ    $80000
  6. FASTMEM    equ    $80000
  7.  
  8.     include    whdload.i
  9.     include    whdmacros.i
  10.     include    exec/memory.i
  11.     include    lvo/exec_lib.i
  12.  
  13. base    SLAVE_HEADER
  14.     dc.w    8,WHDLF_Disk!WHDLF_NoError
  15.     dc.l    CHIPMEM,0        ; basemem, 0
  16.     dc.w    start-base,0,0        ; slave code, dir, dontcache
  17.     dc.b    0,$59            ; debugkey, quitkey
  18. expmem    dc.l    FASTMEM            ; expansion memory (v8)
  19.  
  20. start    move.l    a0,a6
  21.  
  22.     ; initialise memory system
  23.     bsr    InitMem
  24.  
  25.     ; initialise stack
  26. STACK    equ    256        ; I checked; uses at most 156 bytes of stack
  27.     move.w    #0,sr        ; user-mode
  28.     move.l    #STACK,d0    ; demo has stack problems between
  29.     moveq    #MEMF_ANY,d1    ; USP and SSP, so put USP in fastmem
  30.     bsr    AllocMem    ; and leave SSP in chipmem
  31.     move.l    d0,sp
  32.     adda.w    #STACK-4,sp
  33.  
  34.     ; push exit routine onto stack
  35.     pea    TDREASON_OK.w
  36.     pea    resload_Abort(a6)
  37.  
  38.     ; load music
  39.     move.l    #$31a00,d0    ; size
  40.     moveq    #MEMF_CHIP,d1    ; attributes
  41.     move.l    #$79c00,d2    ; offset
  42.     bsr.s    .load
  43.     move.l    d0,-(sp)
  44.  
  45.     ;load demo
  46.     move.l  #$71800,d0    ; size
  47.     moveq    #MEMF_ANY,d1    ; requirements
  48.     move.l  #$8200,d2    ; offset
  49.     bsr.s    .load
  50.     move.l    d0,-(sp)
  51.  
  52.     ; start music
  53.     lea    _custom+dmacon,a4
  54.     move.w    #$1c0,(a4)
  55.     clr.w    $80.w
  56.     move.l    4(sp),a0    ; a0=music ptr
  57.     jsr    (a0)
  58.     move.w    #$8080,(a4)
  59.  
  60.     move.l    (sp)+,a0    ; demo ptr
  61.     move.l    (sp)+,a2    ; music ptr
  62.  
  63.     lea    .msync(pc),a1    ; a1 = sync marks with music
  64.     add.l    #$1a510,a2    ; a2 = something in the music
  65.     jmp    (a0)        ; start demo
  66.  
  67. .msync    dc.w    2,4,8,$12,$16,$18,$1C,$1F,$23,$27,$28,$31,$33,$3C
  68.  
  69. ; d0 = length, d1 = attribs, d2 = offset
  70. .load    move.l    d0,d3
  71.     bsr.s    AllocMem
  72.     move.l    d0,a2
  73.     move.l    d0,a0
  74.     move.l    d2,d0
  75.     move.l    d3,d1
  76.     moveq    #1,d2
  77.     jsr    resload_DiskLoad(a6)    ; a0=addr/d0=offset/d1=size/d2=1
  78.     move.l    a2,a0
  79.     suba.l    a1,a1
  80.     jsr    resload_Relocate(a6)    ; a0=addr/a1=0
  81.     move.l    a2,d0
  82.     rts
  83.  
  84. ;------------------------------
  85. ; AllocMem/FreeMem for WHDLoad
  86.  
  87. InitMem    move.l    expmem(pc),a0        ; fastmem
  88.     lea    $400.w,a1
  89.     move.l    a1,(a0)
  90.     lea    MH_SIZE(a0),a2
  91.     move.l    a2,MH_FIRST(a0)
  92.     move.l    #FASTMEM-MH_SIZE,MH_FREE(a0)
  93.     move.l    a1,4.w            ; chipmem
  94.     patch    _LVOAllocMem(a1),AllocMem
  95.     patch    _LVOFreeMem(a1),FreeMem
  96.     clr.l    (a1)
  97.     lea    MH_SIZE(a1),a0
  98.     move.l    a0,MH_FIRST(a1)
  99.     move.l    #CHIPMEM-$400-MH_SIZE,MH_FREE(a1)
  100.     rts
  101.  
  102. AllocMem
  103. .retry    move.l    expmem(pc),a0
  104.     btst.b    #MEMB_CHIP,d1
  105.     beq.s    .fast
  106.     move.l    (a0),a0
  107. .fast    movem.l    d0/d1,-(sp)
  108.     bsr.s    Allocate
  109.     move.l    (sp)+,a0    ; a0=size
  110.     move.l    (sp)+,d1    ; d1=type
  111.     tst.l    d0
  112.     bne.s    .cont
  113.     btst.b    #MEMB_CHIP,d1    ; ah. failure. was it chip?
  114.     bne    OUTOFMEM    ; yes? total failure
  115.     bset.b    #MEMB_CHIP,d1    ; otherwise, try again as chipmem
  116.     move.l    a0,d0
  117.     bra.s    .retry
  118. .cont    btst    #MEMB_CLEAR,d1
  119.     beq.s    .done
  120.     move.l    a0,d1
  121.     lsr.l    #2,d1        ; reduce size to longwords
  122.     move.l    d0,a0
  123. .clr    clr.l    (a0)+
  124.     subq.l    #1,d1
  125.     bne.s    .clr
  126. .done    rts
  127.  
  128.  
  129. FreeMem    move.l    expmem(pc),a0
  130.     cmpa.l    #CHIPMEM,a1
  131.     bcc.s    .fast
  132.     move.l    (a0),a0
  133. .fast    bsr.s    Deallocate
  134. .done    rts
  135.  
  136.  
  137. ; Allocate and Deallocate from 3.0 ROM (yes, I could write them myself..
  138. ; but deallocate would be bugged and it'd take longer to write)
  139.  
  140. Allocate
  141.     cmp.l    ($1C,a0),d0
  142.     bhi.b    5$
  143.     tst.l    d0
  144.     beq.b    6$
  145.     move.l    a2,-(sp)
  146.     addq.l    #7,d0
  147.     and.w    #-8,d0
  148.     lea    ($10,a0),a2
  149. 1$    movea.l    (a2),a1
  150.     move.l    a1,d1
  151.     beq.b    4$
  152.     cmp.l    (4,a1),d0
  153.     bls.b    2$
  154.     movea.l    (a1),a2
  155.     move.l    a2,d1
  156.     beq.b    4$
  157.     cmp.l    (4,a2),d0
  158.     bhi.b    1$
  159.     exg    a1,a2
  160. 2$    beq.b    3$
  161.     move.l    a3,-(sp)
  162.     lea    (a1,d0.l),a3
  163.     move.l    a3,(a2)
  164.     move.l    (a1),(a3)+
  165.     move.l    (4,a1),d1
  166.     sub.l    d0,d1
  167.     move.l    d1,(a3)
  168.     sub.l    d0,($1C,a0)
  169.     movea.l    (sp)+,a3
  170.     move.l    a1,d0
  171.     movea.l    (sp)+,a2
  172.     rts
  173.  
  174. 3$    move.l    (a1),(a2)
  175.     sub.l    d0,($1C,a0)
  176.     movea.l    (sp)+,a2
  177.     move.l    a1,d0
  178.     rts
  179.  
  180. 4$    movea.l    (sp)+,a2
  181. 5$    moveq    #0,d0
  182. 6$    rts
  183.  
  184. Deallocate
  185.     tst.l    d0
  186.     beq.b    9$
  187.     movem.l    d3/a2,-(sp)
  188.     move.l    a1,d1
  189.     moveq    #-8,d3
  190.     and.l    d3,d1
  191.     exg    d1,a1
  192.     sub.l    a1,d1
  193.     add.l    d1,d0
  194.     addq.l    #7,d0
  195.     and.l    d3,d0
  196.     beq.b    8$
  197.     lea    ($10,a0),a2
  198.     move.l    (a2),d3
  199.     beq.b    4$
  200. 1$    cmpa.l    d3,a1
  201.     bls.b    2$
  202.     movea.l    d3,a2
  203.     move.l    (a2),d3
  204.     bne.b    1$
  205.     bra.b    3$
  206.  
  207. 2$    beq.b    FREETWICE
  208. 3$    moveq    #$10,d1
  209.     add.l    a0,d1
  210.     cmp.l    a2,d1
  211.     beq.b    4$
  212.     move.l    (4,a2),d3
  213.     add.l    a2,d3
  214.     cmp.l    a1,d3
  215.     beq.b    5$
  216.     bhi.b    MEMCORRUPT
  217. 4$    move.l    (a2),(a1)
  218.     move.l    a1,(a2)
  219.     move.l    d0,(4,a1)
  220.     bra.b    6$
  221.  
  222. 5$    add.l    d0,(4,a2)
  223.     movea.l    a2,a1
  224. 6$    tst.l    (a1)
  225.     beq.b    7$
  226.     move.l    (4,a1),d3
  227.     add.l    a1,d3
  228.     cmp.l    (a1),d3
  229.     bhi.b    MEMCORRUPT
  230.     bne.b    7$
  231.     movea.l    (a1),a2
  232.     move.l    (a2),(a1)
  233.     move.l    (4,a2),d3
  234.     add.l    d3,(4,a1)
  235. 7$    add.l    d0,($1C,a0)
  236. 8$    movem.l    (sp)+,d3/a2
  237. 9$    rts
  238.  
  239. OUTOFMEM
  240. FREETWICE
  241. MEMCORRUPT
  242.     illegal
  243.